package com.heima.wemedia.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.heima.feign.schedule.IScheduleFeignClient;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.TaskTypeEnum;
import com.heima.model.schedule.dtos.TaskDto;
import com.heima.model.wemedia.pojos.WmNews;
import com.heima.utils.common.ProtostuffUtil;
import com.heima.wemedia.service.WmNewsAutoScanService;
import com.heima.wemedia.service.WmNewsTaskService;
import com.sun.org.apache.xpath.internal.operations.String;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
@Slf4j
public class WmNewsTaskServiceImpl implements WmNewsTaskService {

    @Autowired
    private IScheduleFeignClient iScheduleFeignClient;
    @Autowired
    private WmNewsAutoScanService wmNewsAutoScanService;

    /**
     * 将 wmnews 定时发布任务添加入 定时任务数据库 和 redis 对应的队列中
     *
     * @param id          wmnews  id
     * @param publishTime wmnews  定时发布的时间
     */
    @Override
    @Async//异步注解
    public void addNewsToTask(Integer id, Date publishTime) {
        log.info("延时任务添加到延迟服务开始...");
        //构建TaskDto参数
        TaskDto taskDto = new TaskDto();
        taskDto.setTaskType(TaskTypeEnum.NEWS_SCAN_TIME.getTaskType());
        taskDto.setPriority(TaskTypeEnum.NEWS_SCAN_TIME.getPriority());
        taskDto.setExecuteTime(publishTime.getTime());
        //封装参数
        WmNews wmNews = new WmNews();
        wmNews.setId(id);
        //使用序列化 prtostuff
        taskDto.setParameters(ProtostuffUtil.serialize(wmNews));
        //先转字符串再转字节，也可以完成
        //taskDto.setParameters(wmNews.toString().getBytes());
        //taskDto.setParameters(id.toString().getBytes());
        //单个： 反序列化可以：
        //String string = new String （ id）

        /**
         * 封装参数：方法 二：
         * 先转字符串，再将字符串转字节
         * taskDto.setParameters(id.toString().getBytes());
         */

        //调用 feign远程接口中的添加
        iScheduleFeignClient.addTask(taskDto);
        log.info("延时任务添加到延迟服务结束...");
    }

    /**
     * 拉取消费任务
     * 自媒体文章审核
     */
    @Override
    @Scheduled(fixedRate = 5000)//定时任务，固定频率每 5 秒一次
    public void popNewsTask() {
        log.info("消费任务，审核文章");

        ResponseResult result = iScheduleFeignClient.popTak(
                TaskTypeEnum.NEWS_SCAN_TIME.getTaskType(),
                TaskTypeEnum.NEWS_SCAN_TIME.getPriority());

        if (result.getCode() == 200 && result.getData() != null) {
            //为什么转两次
            //因为：ResponseResult 返回给前端的都是 json数据
            //第一步：拿到ResponseResult里面的Data（是个json），先转json字符串
            //第二步：再将json字符串转对象
            TaskDto taskDto = JSON.parseObject(JSON.toJSONString(result.getData()), TaskDto.class);

            //使用序列化工具，反序列化出封装的参数
            byte[] parameters = taskDto.getParameters();
            WmNews wmNews = ProtostuffUtil.deserialize(parameters, WmNews.class);

            //
            //调用自动审核功能，将 ID传进去
            wmNewsAutoScanService.newAutoScan(wmNews.getId());
        }
    }
}
